import config from './config';
import request from './request';
import validate from './validate';
import lodash from 'lodash';
/**
 * 数组内查询
 * @param   {array}      array
 * @param   {String}    id
 * @param   {String}    keyAlias
 * @return  {Array}
 */
const queryArray = (array, key, keyAlias = 'key') => {
  if (!(array instanceof Array)) {
    return null
  }
  const item = array.filter(_ => _[keyAlias] === key)
  if (item.length) {
    return item[0]
  }
  return null
}
/**
 * [由数组生成树状对象]
 * @param   {[type]}  array                 [需要转换的数组]
 * @param   {String}  [id='id']             [数组项中子项判断父项的字段，默认为id]
 * @param   {String}  [pid='pid']           [与父项的id对应的字段，默认为pid]
 * @param   {String}  [children='children'] [父项中，子项的键名，默认为children]
 * @return  {[type]}                        [返回的树状对象数组]
 * @author 李树冬
 * @version [version]
 */
const arrayToTree = (array, id = 'id', pid = 'pid', children = 'children') => {
  let data = lodash.cloneDeep(array)
  let result = []
  let hash = {}
  data.forEach((item, index) => {
    hash[data[index][id]] = data[index]
  })

  data.forEach((item) => {
    let hashVP = hash[item[pid]]
    if (hashVP) {
      !hashVP[children] && (hashVP[children] = [])
      hashVP[children].push(item)
    } else {
      result.push(item)
    }
  })
  return result
}

/**
 * [isEmptyObj description]判断对象是否为空
 * @param   {[type]}  obj [description]
 * @return  {Boolean}     [description]
 * @author 李树冬
 * @version [version]
 */
function isEmptyObj(obj) {
  for (let key in obj) {
    return false;
  }
  return true;
}

/**
 * [msec2date 毫秒数转日期操作]
 * @param   {[type]}  str [description]
 * @return  {[type]}      [description]
 * @author 李树冬
 * @version [version]
 */
function msec2date(str){
  //补0操作
  function add0(num){
      if(parseInt(num) < 10){
          num = '0'+num;
      }
      return num;
    }
    var oDate = new Date(str),
    oYear = oDate.getFullYear(),
    oMonth = oDate.getMonth()+1,
    oDay = oDate.getDate(),
    oHour = oDate.getHours(),
    oMin = oDate.getMinutes(),
    oSen = oDate.getSeconds(),
    oTime = oYear +'-'+ add0(oMonth) +'-'+ add0(oDay) +' '+ add0(oHour) +':'+ add0(oMin) +':'+add0(oSen);//最后拼接时间
    return oTime;
};
/**
 * 去抖函数，返回一个在给定时间里多次触发只执行最后一次的函数。
 * @param   {[function]}  func      [需要执行的函数]
 * @param   {[number]}  wait      [延迟时间，单位毫秒]
 * @return  {[function]}        [description]
 * @author 李树冬
 * @version [version]
 */
function debounce(func, wait) {
  return function() {
    const context = this, args = arguments;// 保存函数调用时的上下文和参数，传递给 func

     // 每次这个返回的函数被调用，就清除定时器，以保证不执行 func
     //定时器id是递增，因为js并没有提供获取所有定时器id的接口，所以通过重新设置一次定时器来
     //获取当前id，进而推算出上一次定时器的id，尚不清楚为什么定时器id的步进为3，当步进不为
     //3时，可尝试下方的for循环方式进行清除。
    const timer = setTimeout(function(){},1000);
    clearTimeout(timer-3);
    // for(let i=0, i<timer, i++){
    //   clearTimeout(i);
    // }
    setTimeout(()=>func.apply(context, args), wait);//设置定时任务，并将上下文和参数，传递给 func
  };
};
export default {
  request,
  config,
  queryArray,
  isEmptyObj,
  validate,
  msec2date,
  debounce,
  arrayToTree,
}
